iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Python

進擊的Python系列 第 14

Day14-生成器(萊納)

  • 分享至 

  • xImage
  •  

大家好!我是萊納~我分享Python生成器

https://ithelp.ithome.com.tw/upload/images/20240818/20163257bOpW33zbZ7.png
圖片來源:(https://kknews.cc/comic/5npz2l3.html)

生成器(Generator)

是一種特殊的函數,允許逐漸生成值,而不是一次性返回所有結果。這對於處理大型數據集或需要延遲計算的情況非常有用,因為可以節省記憶體

  • 如何創建生成器?

使用 yield 關鍵字: 當一個函數包含 yield 關鍵字時,這個函數就會變成一個生成器函數。每次調用 next() 方法時,函數會從上次停止的地方繼續執行,直到遇到下一個 yield 表達式,然後返回該值。

生成器優點

  • 節省記憶體: 只在需要時產生值,避免一次性載入所有數據
  • 簡潔高效: 對於產生無限序列或大型數據集非常有用
  • 易於理解: 符合自然語言的表達方式,例如「產生一個斐波那契數列」

生成器基本用法

def create_numbers(n):
    for i in range(n):
        yield i

# 使用生成器
numbers = create_numbers(5)
for num in numbers:
    print(num)
# 生成斐波那契數列的生成器
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 使用生成器
for num in fibonacci():
    if num > 100:
        break
    print(num)

生成器進階用法

列表推導式

可以將列表推導式改為生成器表達式,以節省記憶體

# 列表推導式
squares = [x**2 for x in range(10)]

# 生成器表達式
squares_gen = (x**2 for x in range(10))

無限序列

生成器可以生成無限序列,例如斐波那契數列

def count_up(start=0):
    x = start
    while True:
        yield x
        x += 1
# 使用生成器
counter = count_up(10)
print(next(counter))  # 輸出 10
print(next(counter))  # 輸出 11

文件處理

生成器可以逐行讀取大文件,避免一次性將整個文件讀入記憶體

def read_large_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield line

生成器與列表推導式比較

特性 列表推導式 生成器表達式
記憶體使用 一次性創建整個列表,佔用較多記憶體 逐漸產生值,節省記憶體
返回值 返回一個列表 返回一個生成器對象
使用場景 需要一次性獲取所有值時 需要逐漸處理值時

生成器高級用法

  • send()方法:向生成器傳入值,改變生成器的狀態
  • throw()方法:向生成器拋出異常
  • close()方法:可以關閉生成器

總結

生成器是 Python 中一個強大的工具,可以讓程式碼更加高效、簡潔。特別是在處理大型數據集或需要產生無限序列時,生成器是一個非常好的選擇

嫁給我吧!希斯特莉亞

https://ithelp.ithome.com.tw/upload/images/20240818/20163257aKiLF9fRGL.png
圖片來源:(https://guavanthropology.tw/article/6867)


上一篇
Day13-裝飾器(亞妮)
下一篇
Day14-讀取與儲存文字檔案(九大巨人)
系列文
進擊的Python36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言